package com.geek.javase.ch18.videodemo.reflect.constructors;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.util.stream.Stream;

/*
 *@Date 2025/11/5
 *@Author wangpeng
 *@Description
 * * * 如何通过反射，获取Constructor对象？
 *  * 1.public Constructor<?>[] getConstructors() 获取所有公开的构造方法
 *  * 2.public Constructor<T> getConstructor(Class<?>... parameterTypes) 根据传入的形参类类型，来匹配获取公开的构造方法
 *  * 3.public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法（包括私有的）
 *  * 4.public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 根据传入的形参类类型，来匹配获取构造方法（包括私有的）
 */
public class ConstructorDemo1 {
    //1.public Constructor<?>[] getConstructors() 获取所有公开的构造方法
    @Test
    public void testGetConstructors() {
        //获取类类型
        Class<Person> clazz = Person.class;

        //获取公开的构造方法
        Constructor<?>[] constructors = clazz.getConstructors();
        Stream.of(constructors).forEach(System.out::println);
    }

    // 2.public Constructor<T> getConstructor(Class<?>... parameterTypes) 根据传入的形参类类型，来匹配获取公开的构造方法
    @Test
    public void testGetConstructor() throws NoSuchMethodException {
        //获取类类型
        Class<Person> clazz = Person.class;

        //无参的构造方法是私有的，无法匹配的
       /* Constructor<Person> constructor = clazz.getConstructor();
        System.out.println("constructor"+constructor);*/

        //获取匹配形参的构造方法
        Constructor<Person> constructor1 = clazz.getConstructor(String.class);
        System.out.println("constructor1"+constructor1);

        Constructor<Person> constructor2 = clazz.getConstructor(String.class, int.class);
        System.out.println("constructor2"+constructor2);
    }

    //3.public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法（包括私有的）
    @Test
    public void testGetDeclaredConstructors() {
        //获取类类型
        Class<Person> clazz = Person.class;

        //获取所有的构造方法
        Constructor<?>[] constructors = clazz.getDeclaredConstructors();
        Stream.of(constructors).forEach(System.out::println);
    }

    //4.public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 根据传入的形参类类型，来匹配获取构造方法（包括私有的）
    @Test
    public void testGetDeclaredConstructor() throws NoSuchMethodException {
        //获取类类型
        Class<Person> clazz = Person.class;

        //无参的构造方法是私有的
        Constructor<Person> constructor1 = clazz.getDeclaredConstructor();
        System.out.println("constructor1"+constructor1);

        Constructor<Person> constructor2 = clazz.getDeclaredConstructor(String.class, int.class);
        System.out.println("constructor2"+constructor2);
    }
}
